package com.demo.backtemplate.exception;

import com.demo.backtemplate.exception.lib.IllegalDataException;
import com.xlf.utility.BaseResponse;
import com.xlf.utility.ErrorCode;
import com.xlf.utility.ResultUtil;
import com.xlf.utility.exception.PublicExceptionHandlerAbstract;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.transaction.CannotCreateTransactionException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

/**
 * 公共异常处理器
 * <p>
 * 该类用于处理公共异常;
 * 该类使用 {@link ControllerAdvice} 注解标记;
 *
 * @author xiao_lfeng
 * @version v1.0.0
 * @since v1.0.0
 */
@Slf4j
@ControllerAdvice
public class PublicExceptionHandler extends PublicExceptionHandlerAbstract {

    /**
     * 处理非法数据异常
     * <p>
     * 该方法用于处理非法数据异常;
     * 该方法使用 {@link ExceptionHandler} 注解标记;
     *
     * @param e 非法数据异常
     * @return {@link ResponseEntity}
     */
    @ExceptionHandler(IllegalDataException.class)
    public ResponseEntity<BaseResponse<Void>> handleIllegalDataException(@NotNull IllegalDataException e) {
        return ResultUtil.error(e.getErrorCode(), e.getMessage(), null);
    }

    @ExceptionHandler(HttpMessageNotReadableException.class)
    public ResponseEntity<BaseResponse<Void>> handleHttpMessageNotReadableException(@NotNull HttpMessageNotReadableException ignored) {
        return ResultUtil.error(ErrorCode.BODY_ERROR, "消息不可读", null);
    }
    
    /**
     * 处理数据库连接异常
     * <p>
     * 该方法用于处理数据库连接或访问相关的异常
     * 该方法使用 {@link ExceptionHandler} 注解标记
     *
     * @param e 数据访问异常
     * @return {@link ResponseEntity}
     */
    @ExceptionHandler(DataAccessResourceFailureException.class)
    public ResponseEntity<BaseResponse<Void>> handleDataAccessResourceFailureException(@NotNull DataAccessResourceFailureException e) {
        log.error("数据库连接异常: {}", e.getMessage(), e);
        return ResultUtil.error(ErrorCode.SERVER_INTERNAL_ERROR, "数据库连接失败，请稍后重试", null);
    }
    
    /**
     * 处理事务创建异常
     * <p>
     * 该方法用于处理无法创建事务连接的异常
     * 该方法使用 {@link ExceptionHandler} 注解标记
     *
     * @param e 事务创建异常
     * @return {@link ResponseEntity}
     */
    @ExceptionHandler(CannotCreateTransactionException.class)
    public ResponseEntity<BaseResponse<Void>> handleCannotCreateTransactionException(@NotNull CannotCreateTransactionException e) {
        log.error("无法创建事务连接: {}", e.getMessage(), e);
        return ResultUtil.error(ErrorCode.SERVER_INTERNAL_ERROR, "数据库连接失败，请检查数据库配置或联系管理员", null);
    }
    
    /**
     * 处理所有数据访问异常
     * <p>
     * 该方法用于处理所有未被特定处理的数据访问异常
     * 该方法使用 {@link ExceptionHandler} 注解标记
     *
     * @param e 数据访问异常
     * @return {@link ResponseEntity}
     */
    @ExceptionHandler(DataAccessException.class)
    public ResponseEntity<BaseResponse<Void>> handleDataAccessException(@NotNull DataAccessException e) {
        log.error("数据访问异常: {}", e.getMessage(), e);
        return ResultUtil.error(ErrorCode.SERVER_INTERNAL_ERROR, "数据库操作异常，请稍后重试", null);
    }
}